/**
 * 
 */
package com.oppo.tools;

import java.io.File;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Enumeration;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.Part;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.log4j.Logger;

/**
 * @author 天下有雪
 *
 */
public class MyTools {

	
	/**
	 * log4j日志对象
	 */
	public static Logger logRootLogger = Logger.getLogger("rootLogger");
	/**
	 * 
	 * @功能描述:String类型装换成日期类型
	 */
	public static Date stringToDate(String strDate, String dateFormat) {
		Date date = new Date();
		if(dateFormat == null || dateFormat.length() == 0) {
			dateFormat = "yyyy-MM-dd HH-mm-ss";
		}
		SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
		try {
			date = sdf.parse(strDate);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}
	/**
	 * 
	 * @功能描述:将日期类型数据转换成String类型
	 */
	public static String dateToString(Date date, String dateFormat) {
		String strDate = null;
		if(dateFormat == null || dateFormat.length() == 0) {
			dateFormat = "yyyy-MM-dd HH-mm-ss";
		}
		SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
		strDate = sdf.format(date);
		return strDate;
	}
	
	/**
	 * 
	 * @功能描述:form表单数据转换为实体类数据
	 */
	public static <T>T formToBean(HttpServletRequest request, Class<T> clazz){
		
		T t = null;
		try {
			t = clazz.newInstance();
		} catch (Exception e1) {
			e1.printStackTrace();
		} 
		if (request != null) {
			// 获取request中提交所有的表单控件的name属性值
			Enumeration<String> paramNames = request.getParameterNames();
			if (paramNames != null) {
				ConvertUtils.register(new DataOfStringToDate(), Date.class);
				// 遍历每一个元素
				try {
					while (paramNames.hasMoreElements()) {
						// 取出当前遍历的元素对象:当前的表单的name属性值
						String strName = paramNames.nextElement();
						// 从request获取当前form表单的name属性对应的value值
						String strVal = request.getParameter(strName);
						// 使用反射将表单的value值设置到与之对应的实体类属性中【借助beanutils或者直接使用反射】
						BeanUtils.setProperty(t, strName, strVal);
					}
				} catch (Exception e) {
					// form表单属性值映射到实体类中异常：
					System.out.println("form表单属性值映射到实体类中异常：" + e.getMessage());
					e.printStackTrace();
				}
			}

			
		}
		return t;
	}
public static <T>T formToBean_WithFile(HttpServletRequest request, Class<T> clazz){
		
		T t = null;
		try {
			t = clazz.newInstance();
		} catch (Exception e1) {
			e1.printStackTrace();
		} 
		if (request != null) {
			///////////////////// 文件的映射处理-begin////////////////////////////
			// 从request中将文件流信息进行提取，将其保存到服务器指定目录，并将保存的目录的相对地址存入数据库中
			//System.out.println("request中的上下文内容：" + request.getContentType());
			// 判断当前request请求中是否包含了流文件
			if (request.getContentType().split(";")[0].equals("multipart/form-data")) {
				try {
					// 获取request中的所有的控件的part集合【每个part中包含form表单中的一个控件对象】
					Collection<Part> parts = request.getParts();
					// 临时参数
					String uploadDerictory = "Imgs";//目录
					String uploadFilePrefix = "Img";//头像文件名字前缀
					// 遍历每一个part，处理含有文件的part部分
					if (parts != null && parts.size() > 0) {
						for (Part part : parts) {
							// 检查含有文件流的part部分进行处理
							// 使用part的ContentType来区分该part是包含文件流控件还是普通控件
							// 获取 MINE类型，普通控件的改属性是 null，文件上传控件的属性不是null
							String partContent = part.getContentType();
							if (partContent != null && !partContent.equals("") && part.getSize() > 0) {
								// 处理含有文件流空间的part，进行文件上传
								// 准备文件上传的服务器的路径地址【要求是绝对地址】
								String strRealPath = request.getServletContext().getRealPath("/");

								// 规定：默认存储在 static/uploadfiles/
								String strUploadPath = strRealPath;
								// 文件上传时保存的相对路径地址
								String strRelativePath = "static/uploadfiles/" + uploadDerictory;

								// 检测文件上传目录是否已经存在，如果不存在，则创建
								File file = new File(strUploadPath + strRelativePath);
								if (!file.exists()) {
									file.mkdirs();
								}

								// 默认文件后缀为.dat
								String strFileType = ".dat";
								// 获取包含文件后缀信息的上下文的字符描述串
								String strContent = part.getHeader("Content-Disposition");
								// 正则表达式匹配文件后缀
								String strReg = "\\.\\w*";
								// 创建正则表达式类
								Pattern pattern = Pattern.compile(strReg);
								// 进行匹配操作
								Matcher matcher = pattern.matcher(strContent);
								if (matcher.find()) {
									strFileType = matcher.group(0);
								}
								// 组合一个具有随机码的文件名，防止文件重名
								String strNameFileName = uploadFilePrefix + "_" + System.currentTimeMillis()
										+ strFileType;

								// 使用反射将文件存储的相对路径保存到实例类的属性中
								// 上传文件对象
								part.write(strUploadPath + strRelativePath + File.separatorChar + strNameFileName);

								// 将文件的相对路径保存到文件的实体类属性中
								// 获取文件上传控件的name属性
								String strFieldName = part.getName();
								// 使用反射将表单的value值设置到与之对应的实体类属性中【借助beanutils或者直接使用反射】
								BeanUtils.setProperty(t, strFieldName,
										strRelativePath + File.separatorChar + strNameFileName);

							} else {
								// 处理普通控件
								// 如果在此处进行处理，需要aciton中添加@MultipartConfig注解，所以不建议在此处进行普通控件的处理
							}
						}
					}

				} catch (Exception e) {
					// 文件上传处理异常
					System.out.println("文件上传处理异常：" + e.getMessage());
					e.printStackTrace();
				}
			}
			///////////////////// 文件的映射处理-end////////////////////////////
			// 获取request中提交所有的表单控件的name属性值
			Enumeration<String> paramNames = request.getParameterNames();
			if (paramNames != null) {
				ConvertUtils.register(new DataOfStringToDate(), Date.class);
				// 遍历每一个元素
				try {
					while (paramNames.hasMoreElements()) {
						// 取出当前遍历的元素对象:当前的表单的name属性值
						String strName = paramNames.nextElement();
						// 从request获取当前form表单的name属性对应的value值
						String strVal = request.getParameter(strName);
						// 使用反射将表单的value值设置到与之对应的实体类属性中【借助beanutils或者直接使用反射】
						BeanUtils.setProperty(t, strName, strVal);
					}
				} catch (Exception e) {
					// form表单属性值映射到实体类中异常：
					System.out.println("form表单属性值映射到实体类中异常：" + e.getMessage());
					e.printStackTrace();
				}
			}

			
		}
		return t;
	}
	/**
	 * 
	 * @功能描述:工厂模式创建实例对象
	 */
	public static <T>T getNewInstance(Class<T> clazz){
		T t = null;
		try {
			t = clazz.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return t;
	}

}
